use md5::{Md5, Digest};

/// Md5Util 工具类，用于计算MD5哈希值
pub struct Md5Util;

impl Md5Util {
    /// 计算给定字符串的MD5哈希值
    ///
    /// # 参数
    ///
    /// * `input` - 要计算哈希值的字符串
    ///
    /// # 返回
    ///
    /// 返回一个表示MD5哈希值的32字符十六进制字符串
    ///
    /// # 示例
    ///
    /// ```
    /// let hash = Md5Util::compute_md5("hello");
    /// log::info!("{}", hash);  // 输出: 5d41402abc4b2a76b9719d911017c592
    /// ```
    pub fn compute_md5(input: &str) -> String {
        // 创建一个新的 Md5 哈希计算器
        let mut hasher = Md5::new();
        // 向计算器中写入输入数据
        hasher.update(input.as_bytes());
        // 读取计算结果
        let result = hasher.finalize();
        // 将结果转换为十六进制字符串
        format!("{:x}", result)
    }

    /// 计算给定字节数组的MD5哈希值
    ///
    /// # 参数
    ///
    /// * `input` - 要计算哈希值的字节数组
    ///
    /// # 返回
    ///
    /// 返回一个表示MD5哈希值的32字符十六进制字符串
    ///
    /// # 示例
    ///
    /// ```
    /// let bytes = b"hello";
    /// let hash = Md5Util::compute_md5_bytes(bytes);
    /// log::info!("{}", hash);  // 输出: 5d41402abc4b2a76b9719d911017c592
    /// ```
    pub fn compute_md5_bytes(input: &[u8]) -> String {
        // 创建一个新的 Md5 哈希计算器
        let mut hasher = Md5::new();
        // 向计算器中写入输入数据
        hasher.update(input);
        // 读取计算结果
        let result = hasher.finalize();
        // 将结果转换为十六进制字符串
        format!("{:x}", result)
    }

    /// 验证给定字符串的MD5哈希值是否匹配
    ///
    /// # 参数
    ///
    /// * `input` - 要验证的字符串
    /// * `expected_hash` - 预期的MD5哈希值
    ///
    /// # 返回
    ///
    /// 如果哈希值匹配返回 `true`，否则返回 `false`
    ///
    /// # 示例
    ///
    /// ```
    /// let is_valid = Md5Util::verify_md5("hello", "5d41402abc4b2a76b9719d911017c592");
    /// log::info!("{}", is_valid);  // 输出: true
    /// ```
    pub fn verify_md5(input: &str, expected_hash: &str) -> bool {
        // 计算输入字符串的MD5哈希值
        let computed_hash = Self::compute_md5(input);
        // 比较计算得出的哈希值和预期的哈希值
        computed_hash == expected_hash
    }

    /// 验证给定字节数组的MD5哈希值是否匹配
    ///
    /// # 参数
    ///
    /// * `input` - 要验证的字节数组
    /// * `expected_hash` - 预期的MD5哈希值
    ///
    /// # 返回
    ///
    /// 如果哈希值匹配返回 `true`，否则返回 `false`
    ///
    /// # 示例
    ///
    /// ```
    /// let bytes = b"hello";
    /// let is_valid = Md5Util::verify_md5_bytes(bytes, "5d41402abc4b2a76b9719d911017c592");
    /// log::info!("{}", is_valid);  // 输出: true
    /// ```
    pub fn verify_md5_bytes(input: &[u8], expected_hash: &str) -> bool {
        // 计算输入字节数组的MD5哈希值
        let computed_hash = Self::compute_md5_bytes(input);
        // 比较计算得出的哈希值和预期的哈希值
        computed_hash == expected_hash
    }
}

fn main() {
    // 初始化日志
    env_logger::init();

    // 测试 Md5Util 工具类
    let input = "hello";
    let hash = Md5Util::compute_md5(input);
    log::info!("MD5(\"{}\") = {}", input, hash);

    // 验证MD5哈希值
    let expected_hash = "5d41402abc4b2a76b9719d911017c592";
    let is_valid = Md5Util::verify_md5(input, expected_hash);
    log::info!("验证MD5哈希值: {}", is_valid);
}